{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 1. Representing Time in Connectionist Networks\n", "\n", "This notebook explores how time has been represented in artificial neural networks. There are complex, mathematical models. However, we examine three straightforward methods.\n", "\n", "For this exploration, we will use the encoding method from this week's lab.\n", "\n", "First, we define some text:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "text = (\"This is a test. Ok. What comes next? Depends? Yes. \" +\n", " \"This is also a way of testing prediction. Ok. \" +\n", " \"This is fine. Need lots of data. Ok?\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And an encoding methodology:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "letters = list(set([letter for letter in text]))\n", "\n", "def encode(letter):\n", " index = letters.index(letter)\n", " binary = [0] * len(letters)\n", " binary[index] = 1\n", " return binary\n", "\n", "patterns = {letter: encode(letter) for letter in letters}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.1 NETTalk (1987)\n", "\n", "Consider the problem of reading. That is, given input text, produce a representation of pronouncing that text.\n", "\n", "Consider the word \"cache\". The first \"c\" is pronounced /k/, but the second \"c\" is pronounced /sh/. Now consider the made-up word: Tacoche. How would you pronounce it? How do you even go about making a guess?\n", "\n", "In 1987, the program NETTalk was created to attempt to solve this problem." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "29.0" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "203 / 7" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Additional input units are called **context** or **state** units.\n", "\n", "How is time represented in NETTalk?" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "format": "tab" }, "outputs": [ { "data": { "image/jpeg": "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\nAB//2Q==\n", "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import YouTubeVideo\n", "YouTubeVideo(\"gakJlr3GecE\", width=600)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from conx import Network\n", "\n", "class NETTalk(Network):\n", " def initialize_inputs(self):\n", " pass\n", "\n", " def inputs_size(self):\n", " # Return the number of inputs:\n", " return len(text)\n", "\n", " def get_letter(self, i):\n", " if 0 <= i < len(text):\n", " return text[i]\n", " else:\n", " return text[0]\n", " \n", " def get_inputs(self, i):\n", " inputs = []\n", " for index in range(i - 3, i + 3 + 1):\n", " letter = text[i]\n", " inputs += patterns[letter]\n", " return [inputs, inputs]" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": true }, "outputs": [], "source": [ "pattern_length = len(patterns[\" \"])\n", "input_length = pattern_length * 7\n", "\n", "nettalk = NETTalk(input_length, 80, input_length)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'00000000100000000000000000000000000001000000000000000000000000000010000000000000000000000000000100000000000000000000000000001000000000000000000000000000010000000000000000000000000000100000000000000000000'" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"\".join([str(v) for v in nettalk.get_inputs(0)[0]])" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--------------------------------------------------\n", "Training for max trails: 500 ...\n", "Epoch: 0 TSS error: 13070.2553377 %correct: 0.0\n", "Epoch: 10 TSS error: 716.730931536 %correct: 0.0\n", "Epoch: 20 TSS error: 468.573515397 %correct: 0.0\n", "Epoch: 30 TSS error: 431.95824528 %correct: 0.0\n", "Epoch: 40 TSS error: 416.634038769 %correct: 0.0\n", "Epoch: 50 TSS error: 265.945084501 %correct: 0.37593984962406013\n", "Epoch: 60 TSS error: 261.9540547 %correct: 0.42105263157894735\n", "Epoch: 70 TSS error: 251.242554953 %correct: 0.47368421052631576\n", "Epoch: 80 TSS error: 249.358370138 %correct: 0.42857142857142855\n", "Epoch: 90 TSS error: 240.833746482 %correct: 0.47368421052631576\n", "Epoch: 100 TSS error: 238.423773943 %correct: 0.47368421052631576\n", "Epoch: 110 TSS error: 236.585542687 %correct: 0.47368421052631576\n", "Epoch: 120 TSS error: 235.335515939 %correct: 0.47368421052631576\n", "Epoch: 130 TSS error: 234.6405665 %correct: 0.46616541353383456\n", "Epoch: 140 TSS error: 232.128789819 %correct: 0.47368421052631576\n", "Epoch: 150 TSS error: 223.954463761 %correct: 0.47368421052631576\n", "Epoch: 160 TSS error: 222.844211745 %correct: 0.47368421052631576\n", "Epoch: 170 TSS error: 218.780971297 %correct: 0.47368421052631576\n", "Epoch: 180 TSS error: 212.348584825 %correct: 0.38345864661654133\n", "Epoch: 190 TSS error: 208.880241851 %correct: 0.47368421052631576\n", "Epoch: 200 TSS error: 200.669794731 %correct: 0.47368421052631576\n", "Epoch: 210 TSS error: 199.049227988 %correct: 0.45112781954887216\n", "Epoch: 220 TSS error: 185.857938381 %correct: 0.43609022556390975\n", "Epoch: 230 TSS error: 184.198280768 %correct: 0.47368421052631576\n", "Epoch: 240 TSS error: 183.701842181 %correct: 0.47368421052631576\n", "Epoch: 250 TSS error: 182.849165753 %correct: 0.47368421052631576\n", "Epoch: 260 TSS error: 180.944417168 %correct: 0.47368421052631576\n", "Epoch: 270 TSS error: 174.454805672 %correct: 0.47368421052631576\n", "Epoch: 280 TSS error: 170.033090104 %correct: 0.47368421052631576\n", "Epoch: 290 TSS error: 169.799503757 %correct: 0.47368421052631576\n", "Epoch: 300 TSS error: 169.685143824 %correct: 0.47368421052631576\n", "Epoch: 310 TSS error: 169.584419763 %correct: 0.47368421052631576\n", "Epoch: 320 TSS error: 169.335318947 %correct: 0.47368421052631576\n", "Epoch: 330 TSS error: 168.368304961 %correct: 0.47368421052631576\n", "Epoch: 340 TSS error: 156.421263067 %correct: 0.5488721804511278\n", "Epoch: 350 TSS error: 152.673945599 %correct: 0.5488721804511278\n", "Epoch: 360 TSS error: 148.779486623 %correct: 0.5639097744360902\n", "Epoch: 370 TSS error: 148.566616051 %correct: 0.5639097744360902\n", "Epoch: 380 TSS error: 148.3543419 %correct: 0.5639097744360902\n", "Epoch: 390 TSS error: 141.709235563 %correct: 0.556390977443609\n", "Epoch: 400 TSS error: 139.634931458 %correct: 0.5639097744360902\n", "Epoch: 410 TSS error: 135.253393552 %correct: 0.5639097744360902\n", "Epoch: 420 TSS error: 132.899621933 %correct: 0.5939849624060151\n", "Epoch: 430 TSS error: 129.947022062 %correct: 0.5939849624060151\n", "Epoch: 440 TSS error: 129.634026189 %correct: 0.5939849624060151\n", "Epoch: 450 TSS error: 129.34233424 %correct: 0.5939849624060151\n", "Epoch: 460 TSS error: 127.807039826 %correct: 0.5939849624060151\n", "Epoch: 470 TSS error: 127.60060166 %correct: 0.5939849624060151\n", "Epoch: 480 TSS error: 127.514805405 %correct: 0.5939849624060151\n", "Epoch: 490 TSS error: 127.376012662 %correct: 0.5939849624060151\n", "Epoch: 500 TSS error: 126.600145442 %correct: 0.6015037593984962\n", "--------------------------------------------------\n", "Epoch: 500 TSS error: 126.600145442 %correct: 0.6015037593984962\n" ] } ], "source": [ "nettalk.train(report_rate=10, max_training_epochs=500)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[[0, 13070.255337690462, 0.0],\n", " [10, 716.73093153640559, 0.0],\n", " [20, 468.57351539725056, 0.0],\n", " [30, 431.95824528003442, 0.0],\n", " [40, 416.63403876878135, 0.0],\n", " [50, 265.9450845005108, 0.37593984962406013],\n", " [60, 261.95405469996177, 0.42105263157894735],\n", " [70, 251.24255495313702, 0.47368421052631576],\n", " [80, 249.35837013797794, 0.42857142857142855],\n", " [90, 240.83374648196263, 0.47368421052631576],\n", " [100, 238.42377394323839, 0.47368421052631576],\n", " [110, 236.5855426873446, 0.47368421052631576],\n", " [120, 235.33551593933615, 0.47368421052631576],\n", " [130, 234.64056650023889, 0.46616541353383456],\n", " [140, 232.12878981907664, 0.47368421052631576],\n", " [150, 223.95446376119079, 0.47368421052631576],\n", " [160, 222.84421174504089, 0.47368421052631576],\n", " [170, 218.78097129678011, 0.47368421052631576],\n", " [180, 212.34858482531087, 0.38345864661654133],\n", " [190, 208.88024185073471, 0.47368421052631576],\n", " [200, 200.66979473088767, 0.47368421052631576],\n", " [210, 199.0492279875393, 0.45112781954887216],\n", " [220, 185.85793838145366, 0.43609022556390975],\n", " [230, 184.19828076777677, 0.47368421052631576],\n", " [240, 183.70184218147062, 0.47368421052631576],\n", " [250, 182.8491657534002, 0.47368421052631576],\n", " [260, 180.94441716786105, 0.47368421052631576],\n", " [270, 174.45480567201344, 0.47368421052631576],\n", " [280, 170.03309010410015, 0.47368421052631576],\n", " [290, 169.79950375737079, 0.47368421052631576],\n", " [300, 169.68514382370628, 0.47368421052631576],\n", " [310, 169.58441976319799, 0.47368421052631576],\n", " [320, 169.3353189471139, 0.47368421052631576],\n", " [330, 168.36830496114825, 0.47368421052631576],\n", " [340, 156.42126306674979, 0.5488721804511278],\n", " [350, 152.67394559851809, 0.5488721804511278],\n", " [360, 148.77948662250174, 0.5639097744360902],\n", " [370, 148.56661605062305, 0.5639097744360902],\n", " [380, 148.35434190048989, 0.5639097744360902],\n", " [390, 141.70923556269494, 0.556390977443609],\n", " [400, 139.63493145836725, 0.5639097744360902],\n", " [410, 135.25339355186716, 0.5639097744360902],\n", " [420, 132.89962193267056, 0.5939849624060151],\n", " [430, 129.94702206152613, 0.5939849624060151],\n", " [440, 129.63402618887667, 0.5939849624060151],\n", " [450, 129.34233423992214, 0.5939849624060151],\n", " [460, 127.80703982616402, 0.5939849624060151],\n", " [470, 127.60060165960947, 0.5939849624060151],\n", " [480, 127.51480540540372, 0.5939849624060151],\n", " [490, 127.37601266242373, 0.5939849624060151],\n", " [500, 126.60014544226198, 0.6015037593984962]]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nettalk.get_history()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\n", "mpl.get_websocket_type = function() {\n", " if (typeof(WebSocket) !== 'undefined') {\n", " return WebSocket;\n", " } else if (typeof(MozWebSocket) !== 'undefined') {\n", " return MozWebSocket;\n", " } else {\n", " alert('Your browser does not have WebSocket support.' +\n", " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", " 'Firefox 4 and 5 are also supported but you ' +\n", " 'have to enable WebSockets in about:config.');\n", " };\n", "}\n", "\n", "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", " this.id = figure_id;\n", "\n", " this.ws = websocket;\n", "\n", " this.supports_binary = (this.ws.binaryType != undefined);\n", "\n", " if (!this.supports_binary) {\n", " var warnings = document.getElementById(\"mpl-warnings\");\n", " if (warnings) {\n", " warnings.style.display = 'block';\n", " warnings.textContent = (\n", " \"This browser does not support binary websocket messages. \" +\n", " \"Performance may be slow.\");\n", " }\n", " }\n", "\n", " this.imageObj = new Image();\n", "\n", " this.context = undefined;\n", " this.message = undefined;\n", " this.canvas = undefined;\n", " this.rubberband_canvas = undefined;\n", " this.rubberband_context = undefined;\n", " this.format_dropdown = undefined;\n", "\n", " this.image_mode = 'full';\n", "\n", " this.root = $('
');\n", " this._root_extra_style(this.root)\n", " this.root.attr('style', 'display: inline-block');\n", "\n", " $(parent_element).append(this.root);\n", "\n", " this._init_header(this);\n", " this._init_canvas(this);\n", " this._init_toolbar(this);\n", "\n", " var fig = this;\n", "\n", " this.waiting = false;\n", "\n", " this.ws.onopen = function () {\n", " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", " fig.send_message(\"send_image_mode\", {});\n", " fig.send_message(\"refresh\", {});\n", " }\n", "\n", " this.imageObj.onload = function() {\n", " if (fig.image_mode == 'full') {\n", " // Full images could contain transparency (where diff images\n", " // almost always do), so we need to clear the canvas so that\n", " // there is no ghosting.\n", " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", " }\n", " fig.context.drawImage(fig.imageObj, 0, 0);\n", " };\n", "\n", " this.imageObj.onunload = function() {\n", " this.ws.close();\n", " }\n", "\n", " this.ws.onmessage = this._make_on_message_function(this);\n", "\n", " this.ondownload = ondownload;\n", "}\n", "\n", "mpl.figure.prototype._init_header = function() {\n", " var titlebar = $(\n", " '
');\n", " var titletext = $(\n", " '
');\n", " titlebar.append(titletext)\n", " this.root.append(titlebar);\n", " this.header = titletext[0];\n", "}\n", "\n", "\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "\n", "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "mpl.figure.prototype._init_canvas = function() {\n", " var fig = this;\n", "\n", " var canvas_div = $('
');\n", "\n", " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", "\n", " function canvas_keyboard_event(event) {\n", " return fig.key_event(event, event['data']);\n", " }\n", "\n", " canvas_div.keydown('key_press', canvas_keyboard_event);\n", " canvas_div.keyup('key_release', canvas_keyboard_event);\n", " this.canvas_div = canvas_div\n", " this._canvas_extra_style(canvas_div)\n", " this.root.append(canvas_div);\n", "\n", " var canvas = $('');\n", " canvas.addClass('mpl-canvas');\n", " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", "\n", " this.canvas = canvas[0];\n", " this.context = canvas[0].getContext(\"2d\");\n", "\n", " var rubberband = $('');\n", " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", "\n", " var pass_mouse_events = true;\n", "\n", " canvas_div.resizable({\n", " start: function(event, ui) {\n", " pass_mouse_events = false;\n", " },\n", " resize: function(event, ui) {\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " stop: function(event, ui) {\n", " pass_mouse_events = true;\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " });\n", "\n", " function mouse_event_fn(event) {\n", " if (pass_mouse_events)\n", " return fig.mouse_event(event, event['data']);\n", " }\n", "\n", " rubberband.mousedown('button_press', mouse_event_fn);\n", " rubberband.mouseup('button_release', mouse_event_fn);\n", " // Throttle sequential mouse events to 1 every 20ms.\n", " rubberband.mousemove('motion_notify', mouse_event_fn);\n", "\n", " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", "\n", " canvas_div.on(\"wheel\", function (event) {\n", " event = event.originalEvent;\n", " event['data'] = 'scroll'\n", " if (event.deltaY < 0) {\n", " event.step = 1;\n", " } else {\n", " event.step = -1;\n", " }\n", " mouse_event_fn(event);\n", " });\n", "\n", " canvas_div.append(canvas);\n", " canvas_div.append(rubberband);\n", "\n", " this.rubberband = rubberband;\n", " this.rubberband_canvas = rubberband[0];\n", " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", " this.rubberband_context.strokeStyle = \"#000000\";\n", "\n", " this._resize_canvas = function(width, height) {\n", " // Keep the size of the canvas, canvas container, and rubber band\n", " // canvas in synch.\n", " canvas_div.css('width', width)\n", " canvas_div.css('height', height)\n", "\n", " canvas.attr('width', width);\n", " canvas.attr('height', height);\n", "\n", " rubberband.attr('width', width);\n", " rubberband.attr('height', height);\n", " }\n", "\n", " // Set the figure to an initial 600x600px, this will subsequently be updated\n", " // upon first draw.\n", " this._resize_canvas(600, 600);\n", "\n", " // Disable right mouse context menu.\n", " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", " return false;\n", " });\n", "\n", " function set_focus () {\n", " canvas.focus();\n", " canvas_div.focus();\n", " }\n", "\n", " window.setTimeout(set_focus, 100);\n", "}\n", "\n", "mpl.figure.prototype._init_toolbar = function() {\n", " var fig = this;\n", "\n", " var nav_element = $('
')\n", " nav_element.attr('style', 'width: 100%');\n", " this.root.append(nav_element);\n", "\n", " // Define a callback function for later on.\n", " function toolbar_event(event) {\n", " return fig.toolbar_button_onclick(event['data']);\n", " }\n", " function toolbar_mouse_event(event) {\n", " return fig.toolbar_button_onmouseover(event['data']);\n", " }\n", "\n", " for(var toolbar_ind in mpl.toolbar_items) {\n", " var name = mpl.toolbar_items[toolbar_ind][0];\n", " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", " var image = mpl.toolbar_items[toolbar_ind][2];\n", " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", "\n", " if (!name) {\n", " // put a spacer in here.\n", " continue;\n", " }\n", " var button = $('